package model;
/**
 * @ Authors:
 * 
 * @Veronique De Laet
 * @Johan Willems
 * @Pierre Delaere
 * 
 * @version 2011
 */

import java.util.Observable;

import model.container.Inschrijvingen;
import utils.Lokalen;
import utils.TijdsMoment1Dag;
import model.AangebodenCursusState;
import model.AfgeslotenAangebodenCursusState;
import model.GeannuleerdAangebodenCursusState;
import model.OpenAangebodenCursusState;
import model.VolzetAangebodenCursusState;


public class AangebodenCursus extends Observable {
	
	
	private int cursusCode;
	private int aantalPlaatsen;
	private Lokalen lokaal;
	private int minAantalPlaatsen;
	public int count;

	private TijdsMoment1Dag tijdsMoment;
	private String lectorCode;
	
	private AangebodenCursusState        openAangebodenCursusState;
	private AangebodenCursusState        geannuleerdAangebodenCursusState;
	private AangebodenCursusState        volzetAangebodenCursusState;
	private AangebodenCursusState        afgeslotenAangebodenCursusState;
	
	private AangebodenCursusState state = openAangebodenCursusState;
		

	public AangebodenCursus (int deCursusCode, Lokalen lok, int aantalPl, TijdsMoment1Dag tijdDagLes, String lectorCode){
		this.cursusCode = deCursusCode;
		this.aantalPlaatsen = aantalPl;
		this.lokaal = lok;
		this.tijdsMoment = tijdDagLes;
		this.lectorCode = lectorCode;
		this.minAantalPlaatsen = 2;
		this.afgeslotenAangebodenCursusState = new AfgeslotenAangebodenCursusState(this);
		this.geannuleerdAangebodenCursusState = new GeannuleerdAangebodenCursusState(this);
		this.openAangebodenCursusState = new OpenAangebodenCursusState(this);
		this.volzetAangebodenCursusState = new VolzetAangebodenCursusState(this);
		this.count =0;
		if(this.aantalInschrijvingen(this) == this.aantalPlaatsen)
		{
			state = volzetAangebodenCursusState;
		}
	}
	/**
	public void registerObserver(Observer o) 
	{
		observers.add(o);
	}
	
	public void removeObserver(Observer o) 
	{
		int i = observers.indexOf(o);
		if (i >= 0) 
		{
		observers.remove(i);
		}
	}
	public void notifyObservers()
	{
		for (int i = 0; i < observers.size(); i++)
		{
		Observer observer = (Observer)observers.get(i);
		observer.update( state);
		}
	}
	*/
	
	public void stateChanged()
	{
		setChanged();
		notifyObservers();
	}
	
	public void setMeasurements(AangebodenCursusState state) {
		this.state = state;
		stateChanged();
		}
	
	
	public void annuleerCursus() 
	{
		state.annuleerCursus();
	}
	public void afsluitenInschrijving()
	{
		state.afsluitenInschrijving();
	}
	public void uitschrijvenStudent()
	{
		state.uitschrijvenStudent();
	}
	public void inschrijvenStudent()
	{
		state.inschrijvenStudent();
	}	
	
	public AangebodenCursusState getOpenAangebodenCursusState() {
		return openAangebodenCursusState;
	}

	public void setOpenAangebodenCursusState(AangebodenCursusState openAangebodenCursusState)
	{
		this.openAangebodenCursusState = openAangebodenCursusState;
	}

	public AangebodenCursusState getGeannuleerdAangebodenCursusState() {
		return geannuleerdAangebodenCursusState;
	}

	public void setGeannuleerdAangebodenCursusState(AangebodenCursusState geannuleerdAangebodenCursusState)
	{
		this.geannuleerdAangebodenCursusState = geannuleerdAangebodenCursusState;
	}

	public AangebodenCursusState getVolzetAangebodenCursusState() 
	{
		return volzetAangebodenCursusState;
	}

	public void setVolzetAangebodenCursusState(AangebodenCursusState volzetAangebodenCursusState) 
	{
		this.volzetAangebodenCursusState = volzetAangebodenCursusState;
	}

	public AangebodenCursusState getAfgeslotenAangebodenCursusState()
	{
		return afgeslotenAangebodenCursusState;
	}

	public void setAfgeslotenAangebodenCursusState(AangebodenCursusState afgeslotenAangebodenCursusState) 
	{
		this.afgeslotenAangebodenCursusState = afgeslotenAangebodenCursusState;
	}
	
	public int getMinAantalPlaatsen() {
		return minAantalPlaatsen;
	}

	public void setMinAantalPlaatsen(int minAantalPlaatsen) {
		this.minAantalPlaatsen = minAantalPlaatsen;
	}
	
	public AangebodenCursusState getState() 
	{
		return state;
	}

	public void setState(AangebodenCursusState state)
	{
		this.state = state;
	}
	
	
	public void changeState(int state)
    {
       //this.state = state;
    }
    
	
	public int getCursusCode() {
		return cursusCode;
	}

	public void setCursusCode(int cursusCode) {
		this.cursusCode = cursusCode;
	}

	/**
	 * @return the tijdsMoment
	 */
	public TijdsMoment1Dag getTijdsMoment() {
		return tijdsMoment;
	}


	/**
	 * @param tijdsMoment the tijdsMoment to set
	 */
	public void setTijdsMoment(TijdsMoment1Dag tijdsMoment) {
		this.tijdsMoment = tijdsMoment;
	}


	/**
	 * @return the lector
	 */
	public String getLectorCode() {
		return lectorCode;
	}


	/**
	 * @param lector the lector to set
	 */
	public void setLector(String lectorCode) {
		this.lectorCode = lectorCode;
	}
	
	/**
	 * @return the tijdDag
	 */
	public TijdsMoment1Dag getTijdDag() {
		return tijdsMoment;
	}


	/**
	 * @param tijdDag the tijdDag to set
	 */
	public void setTijdDag(TijdsMoment1Dag tijdDag) {
		this.tijdsMoment = tijdDag;
	}


	/**
	 * @return the aantalPlaatsen
	 */
	public int getAantalPlaatsen() {
		return aantalPlaatsen;
	}
	/**
	 * @param aantalPlaatsen the aantalPlaatsen to set
	 */
	public void setAantalPlaatsen(int aantalPlaatsen) {
		this.aantalPlaatsen = aantalPlaatsen;
	}
	/**
	 * @return the lokaal
	 */
	public Lokalen getLokaal() {
		return lokaal;
	}
	/**
	 * @param lokaal the lokaal to set
	 */
	public void setLokaal(Lokalen lokaal) {
		this.lokaal = lokaal;
	}
	
	public Object[] toObjectArray() 
	{    
		return new Object[] {getCursusCode(), getTijdDag(), getLokaal()};
	} 
	

	public int aantalInschrijvingen(AangebodenCursus aangebodenCursus)
	{
		for(Inschrijving inschrijving : Inschrijvingen.inschrijvingsLijst)
		{
			Inschrijving deInschrijving = inschrijving;
			int cursusCode = deInschrijving.getAangebodenCursus().getCursusCode();
	
			if (aangebodenCursus.getCursusCode() == cursusCode)
			{
				count +=1;
				
			}
		}
			return count;
		}
}
